<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>循环指令</title>
</head>
<body>
<div id="app">


  <!-- ■【遍历数组】-->
  <!--  v-for是vue标签中指定for循环的标签，标签对应的值的也就是类似python中for循环或者java中foreach的写法
        除了直接获取到每个数组的元素，还可以获得元素和索引值，(item,index) 对应 (元素,索引)-->
  <li v-for="item in movies">{{item}}</li>
  <hr>
  <li v-for="(item,index) in movies">{{index}}-{{item}}</li>
  <hr>


  <!-- ■【遍历对象】-->
  <!--  v-for在遍历对象时，如果只获取一个值，那么获取到的是对象属性值value-->
  <li v-for="item in user">{{item}}</li>
  <hr>
  <!--  v-for在遍历对象时，获取两个值，那么获取到的是对象属性值value和属性的名称key-->
  <li v-for="(item,key) in user">{{item}}-{{key}}</li>
  <hr>
  <!--  v-for在遍历对象时，获取三个值，那么获取到的是对象属性值value和属性的名称key和属性的顺序索引index，索引默认从0开始-->
  <li v-for="(item,key,index) in user">{{item}}-{{key}}-{{index}}</li>
  <hr>

  <!-- ■【数字迭代】-->
  <!--  迭代数字，默认从1开始，这里是循环5次，从1开始递增-->
  <li v-for="i in 5">这是第{{i}}次迭代</li>
  <hr>

  <!--
  ■【v-bind:key 的使用】：

  ●官方推荐我们在使用v-for时,给对应的元素或组件添加上一个key属性。
  口为什么需要这个key属性呢(了解) ?
    口这个其实和Vue的虚拟DOM的Diff算法有关系
    口这里我们借用React' s diff algorithm中的一张图来简单说明一下:
  口当某一层有很多相同的节点时,也就是列表节点时,我们希望插入一个新的节点
    口我们希望可以在B和C之间加一个F, Diff默认执行起来是这样的.
    口即把C更新成F, D更新成C , E更新成D,最后再插入E,是不是很没有效率？
  口所以我们需要使用key来给每个节点做一个唯一标识
    口Diff算法就可以正确的识别此节点
    口找到正确的位置区插入新的节点。
  口所以一句话, key的作用主要是为了高效的更新虚拟DOM，可以简单理解为数组和链表之间的插入效率对比
  -->

  <!--  ●绑定key最好和元素保持一致，而不是用索引index来绑定key,原因是索引会变化，因为我们在数组中间插入一个元素，元素的索引也会相应的变化，
  就没有保证key的唯一性，为了保证key的唯一性，用元素值来绑定，其实通过元素值来绑定的话必须是数组中元素不等，不然key也有可能相等，如果元素是对象，
  应该用对象中能保证唯一性的属性作为key。总结一句话，key要保证唯一性不可变化性，可以理解成sql中的主键 -->
  <li v-for="(item,index) in chars" :key="item">{{item}}-{{index}}</li>
</div>

<script src="../js/vue.js"></script>
<script>
  const app = new Vue({
    el: "#app",
    data: {
      movies: ['海王', '海尔兄弟', '火影忍者', '进击的巨人'],
      user: {
        name: "kobe",
        age: 43,
        height: 196
      },
      chars: ['A', 'B', 'C', 'D', 'E']
    }
  });
</script>
</body>
</html>